package com.dimples.dd.system.mapper;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import com.dimples.dd.common.pojo.PageResult;
import com.dimples.dd.mybatis.core.mapper.BaseMapperX;
import com.dimples.dd.mybatis.core.query.MPJLambdaWrapperX;
import com.dimples.dd.system.model.bo.NoticeBO;
import com.dimples.dd.system.model.entity.SystemNoticeDO;
import com.dimples.dd.system.model.entity.SystemUsersDO;
import com.dimples.dd.system.model.query.NoticePageQuery;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface SystemNoticeMapper extends BaseMapperX<SystemNoticeDO> {

    /**
     * 获取通知公告分页数据
     *
     * @param queryParams 查询参数
     * @return 通知公告分页数据
     */
    default PageResult<NoticeBO> selectNoticePage(NoticePageQuery queryParams) {
        MPJLambdaWrapperX<SystemNoticeDO> wrapperX = new MPJLambdaWrapperX<>();
        wrapperX.leftJoin(SystemUsersDO.class, SystemUsersDO::getId, SystemNoticeDO::getPublisherId);
        wrapperX.selectAs(SystemUsersDO::getNickname, NoticeBO::getPublisherName)
                .select(SystemNoticeDO::getId, SystemNoticeDO::getTitle, SystemNoticeDO::getType, SystemNoticeDO::getTargetType, SystemNoticeDO::getContent
                        , SystemNoticeDO::getLevel, SystemNoticeDO::getPublishStatus, SystemNoticeDO::getPublishTime, SystemNoticeDO::getCreateTime, SystemNoticeDO::getRevokeTime);
        wrapperX.likeIfPresent(SystemNoticeDO::getTitle, queryParams.getTitle())
                .eqIfPresent(SystemNoticeDO::getPublishStatus, queryParams.getPublishStatus());
        if (CollUtil.isNotEmpty(queryParams.getPublishTime())) {
            wrapperX.ge(SystemNoticeDO::getPublishTime, DateUtil.beginOfDay(DateUtil.date(queryParams.getPublishTime().get(0))))
                    .le(SystemNoticeDO::getPublishTime, DateUtil.endOfDay(DateUtil.date(queryParams.getPublishTime().get(1))));
        }
        wrapperX.orderByDesc(SystemNoticeDO::getCreateTime, SystemNoticeDO::getPublishTime);
        return this.selectJoinPage(queryParams, NoticeBO.class, wrapperX);
    }

    /**
     * 获取阅读时通知公告详情
     *
     * @param id 通知公告ID
     * @return 通知公告详情
     */
    default NoticeBO selectNoticeDetail(Long id) {
        MPJLambdaWrapperX<SystemNoticeDO> wrapperX = new MPJLambdaWrapperX<>();
        wrapperX.leftJoin(SystemUsersDO.class, SystemUsersDO::getId, SystemNoticeDO::getPublisherId);
        wrapperX.selectAs(SystemUsersDO::getNickname, NoticeBO::getPublisherName)
                .select(SystemNoticeDO::getId, SystemNoticeDO::getTitle, SystemNoticeDO::getType, SystemNoticeDO::getLevel, SystemNoticeDO::getContent
                        , SystemNoticeDO::getTargetType, SystemNoticeDO::getPublishStatus, SystemNoticeDO::getPublishTime, SystemNoticeDO::getRevokeTime, SystemNoticeDO::getCreateTime);
        wrapperX.eq(SystemNoticeDO::getId, id);
        return this.selectJoinOne(NoticeBO.class, wrapperX);
    }
}